#include "UART.h"

/******************************************************************************/

static int UART_WhichPort = 0;

////////////////////////////////////////////////////////////////////////////////

void UART_SelectPort(int which)
{
    if(which == 1) UART_WhichPort = 1;
    else if(which ==2) UART_WhichPort = 2;
    else UART_WhichPort = 0;
}

////////////////////////////////////////////////////////////////////////////////

int UART_GetCurrentPort(void)
{
    return UART_WhichPort;
}

////////////////////////////////////////////////////////////////////////////////

void UART_Init(int baud)
{
    VoidPFncInt pFnc[] = {UART0_Init,UART1_Init,UART2_Init};
    (*pFnc[UART_WhichPort])(baud);
}

////////////////////////////////////////////////////////////////////////////////

void UART_SetDefault(void)
{
    VoidPFncVoid pFnc[] = {UART0_SetDefault,UART1_SetDefault,UART2_SetDefault};
    (*pFnc[UART_WhichPort])();
}

////////////////////////////////////////////////////////////////////////////////

int  UART_kbhit(void)
{
    IntPFncVoid pFnc[] = {UART0_kbhit,UART1_kbhit,UART2_kbhit};
    return (*pFnc[UART_WhichPort])();
}

////////////////////////////////////////////////////////////////////////////////

char UART_getch(void)
{
    CharPFncVoid pFnc[] = {UART0_getch,UART1_getch,UART2_getch};
    return (*pFnc[UART_WhichPort])();
}

////////////////////////////////////////////////////////////////////////////////

void UART_gets(char *string)
{
    VoidPFncPChar pFnc[] = {UART0_gets,UART1_gets,UART2_gets};
    (*pFnc[UART_WhichPort])(string);
}

////////////////////////////////////////////////////////////////////////////////

int  UART_putchar(char data)
{
    IntPFncChar pFnc[] = {UART0_putchar,UART1_putchar,UART2_putchar};
    return (*pFnc[UART_WhichPort])(data);
}

////////////////////////////////////////////////////////////////////////////////

void UART_puts(char *pStr)
{
    VoidPFncPChar pFnc[] = {UART0_puts,UART1_puts,UART2_puts};
    (*pFnc[UART_WhichPort])(pStr);
}

////////////////////////////////////////////////////////////////////////////////

#include "stdarg.h"
#include "stdio.h"

void UART_printf(char *fmt,...)
{
    va_list ap;
    char string[256];

    va_start(ap,fmt);
    vsprintf(string,fmt,ap);
    switch(UART_WhichPort)
    {
        case 0: UART0_puts(string); break;
        case 1: UART1_puts(string); break;
        case 2: UART2_puts(string); break;
    }
        va_end(ap);
}